/*****************************************
**  Nom : COLLOMB - SALINAS - CARRUELLE **
**	Nom du fichier : strut.h			**
**	Description : Regroupe toutes les   **
**                structures de chaque  **
**				  fichier				**
**										**
**	Date : 14/08/2014				    **
**  Statut : In Work					**
*****************************************/

/*****************************************
**  Zone de declaration des includes    **
*****************************************/

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <signal.h>
#include <sys/msg.h>
#include <sys/sem.h>
#include <termios.h>


/*****************************************
**  Zone de declaration des constantes  **
*****************************************/

 #define MAXSIZE 20
 #define TRUE 1
 #define FALSE 0
 #define NUMERO_PREMIER_JOUEUR 1
 #define NOMBRE_SIGNE 4
 #define NOMBRE_CARTE 13
 #define NOMBRE_CARTE_TOTAL 52
 #define NOMBRE_JOUEUR 4
 #define IND_IA_1 2
 #define TAILLE_MAX 2000
 #define NOMBRE_CARTE_PAR_JOUEUR 13
 #define NOMBRE_JOUEUR_MIN 2
 #define Fic_Regles "Regles"
 #define Fic_Faits "Faits"
 #define LAST_CARDS 3
 #define SEPARATEUR "*"

 #define Player1 1
 #define Player2 2
 #define Player3 4
 #define Player4 8



/*****************************************
**  Zone de declaration des structures  **
*****************************************/

 typedef struct CONDITION
 {
	 char cond[MAXSIZE];
	 int valid;
	 struct CONDITION *suiv;
 } ST_COND;

 typedef struct FAITS
 {
	 char fait[MAXSIZE];
	 struct FAITS *suiv;
 } ST_FAITS;

 typedef struct RESULTAT
 {
	 char res[MAXSIZE];
	 int valid;
	 int nb_cond;
	 int nb_cond_valid;
	 ST_COND* TeteListCond;
	 struct RESULTAT *suiv;
 } ST_RES;

 typedef struct S_CARTE
 {
	 int valeur;	//valeur de la carte de 1(as) a 13(roi)
	 int signe; 	//1=coeur;2=carreau;3=pique;4=trefle
	 struct S_CARTE *carte_suivante;
 }S_CARTE;

 typedef struct fifo_paquet
 {
	 int nom_joueur; //proprietaire
	 int nb_carte; 	 //nombre de carte contenu dans le paquet
	 struct S_CARTE *carte_in;  //lien vers carte au-dessus du paquet
	 struct S_CARTE *carte_out; //lien vers carte du-dessous du paquet
 }FIFO_PAQUET;

typedef struct
{
	int Un_entier;
	char Un_char;
	char Difficulty[MAXSIZE];
}ST_SEG;

typedef struct
{
	int Status_Joueur; // Savoir l'etat du joueur 1 Doit poser, 0 a posé
	int Nb_Joueur_Ia;	//Nombre de IA
	S_CARTE Carte[3];	// Recupere les 3 dernieres cartes
	int Status_Partie;	//Connaitre l'etat de la partie
	int Difficult_IA;	//Connaitre la difficulté de l'IA
	int Nb_Cartes_Restantes[4];	//Connaitre les nombre de cartes restantes par joueur
	int Tapage;
	int Tete;
	int Qui_Pose;
	int Qui_Last_Tete;
	int Last_Joueur;
	int Nb_Cartes_a_poser;	//Connaitre le nombre de cartes qui reste à poser au joueur lorqu'une tête est posée
	int menu_action;
	int Quitter;
}ST_IHM;

  typedef struct
{
	FILE* fp;				  // Descripteur de fichier NULL!!!!
    ST_RES* Tete_Res;		  // Pointeur vers la tete des regles NULL!!!!
 	ST_FAITS* Tete_Faits;	  // Pointeur vers la tete des faits NULL!!!!!
 	FIFO_PAQUET table;               // FIFO de la Table
	FIFO_PAQUET J1;                  // FIFO du Joueur 1
	FIFO_PAQUET J2;                  // FIFO du Joueur 2
	FIFO_PAQUET J3;                  // FIFO du Joueur 3
	FIFO_PAQUET J4;                  // FIFO du Joueur 4
	char players_Eliminated;
	char winner;
	int  who_tape;
	int  id_player;
	int  Default;
	char mask;
	int nb_pose;
	int flag_recup;
	int last_player;
	int allow_display;
}GAME;


 #include "sm_shm.h"
 #include "CreerListeCh.h"
 #include "ChngAvt.h"
 #include "ChainArr.h"
 #include "InitPartie.h"
 #include "DrlmntPartie.h"
 #include "DetectionTouche.h"
 #include "AfficheRegles.h"


